Import('env', 'sys', 'os', 'hasPython')

for ver in hasPython:
        sver = ver.replace('.', '')
        python_include = list(env['PYTHON'+sver+'INCLUDE']) if 'PYTHON'+sver+'INCLUDE' in env else [] # if env.has_key('PYTHON'+sver+'INCLUDE') else []
        python_libdir = list(env['PYTHON'+sver+'LIBDIR']) if 'PYTHON'+sver+'LIBDIR' in env else [] # if env.has_key('PYTHON'+sver+'LIBDIR') else []
        python_lib = list(env['PYTHON'+sver+'LIB']) if 'PYTHON'+sver+'LIB' in env else [] # if env.has_key('PYTHON'+sver+'LIB') else []

        if 'linux' in sys.platform:
                # On Linux, don't link to the core Python library. The associated symbols will be resolved
                # when the plugin is imported into a running interpreter
                python_lib = [ lib for lib in python_lib if not lib.startswith('python') ]

        pythonEnv = env.Clone()
        pythonEnv.Prepend(CPPPATH=python_include)
        pythonEnv.Prepend(LIBPATH=python_libdir)
        pythonEnv.Prepend(LIBS=python_lib)


        pythonEnv.Append(CPPDEFINES = [['MTS_BUILD_MODULE', 'MTS_MODULE_PYTHON']])
        pythonEnv['SHLIBPREFIX']=''
        pythonEnv.RelaxCompilerSettings()
        pythonEnv.Append(LIBS=['mitsuba-bidir'])
        pythonEnv.Append(LIBPATH=['#src/libbidir'])

        if 'XERCESINCLUDE' in pythonEnv: # pythonEnv.has_key('XERCESINCLUDE'):
                pythonEnv.Prepend(CPPPATH=pythonEnv['XERCESINCLUDE'])
        if 'XERCESLIBDIR' in pythonEnv: # pythonEnv.has_key('XERCESLIBDIR'):
                pythonEnv.Prepend(LIBPATH=pythonEnv['XERCESLIBDIR'])
        if 'XERCESLIB' in pythonEnv: # pythonEnv.has_key('XERCESLIB'):
                pythonEnv.Prepend(LIBS=pythonEnv['XERCESLIB'])

        if sys.platform != 'win32':
                # Python has serious aliasing issues. Disable -fstrict-aliasing only for this library
                pythonEnv.Append(CXXFLAGS = ['-fno-strict-aliasing'])
                pythonEnv.RemoveFlags(['-fstrict-aliasing', '-ftree-vectorize'])
        else:
                # Create an OBJ file with many addressable sections (or compilation may fail on Windows)
                pythonEnv.Append(CPPFLAGS = ['/bigobj'])

        if sys.platform == 'darwin':
                pythonEnv.Append(LINKFLAGS=['-Xlinker', '-rpath', '-Xlinker', '@loader_path/../../Contents/Frameworks', '-undefined', 'dynamic_lookup'])
        elif 'linux' in sys.platform:
                # Linux: ensure that all core Mitsuba libraries are loaded when the plugin is used in Python
                pythonEnv.Append(SHLINKFLAGS=['-Wl,-R,\'$$ORIGIN/../..\''])
                pythonEnv.Append(SHLINKFLAGS=['-Wl,-no-as-needed', '-lmitsuba-hw', '-Wl,-no-as-needed', '-lmitsuba-bidir'])

        libcore_obj = pythonEnv.SharedObject('core_'+ver, 'core.cpp')
        librender_obj = pythonEnv.SharedObject('render_'+ver, 'render.cpp')
        libpython = pythonEnv.SharedLibrary('mitsuba_python'+ver, [libcore_obj, librender_obj])

        if sys.platform == 'darwin':
                env.AddPostAction(libpython, 'strip -u -r $TARGET')
        elif 'linux' in sys.platform:
                env.AddPostAction(libpython, 'strip $TARGET')
